﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Mail;
using System.Runtime.Remoting.Contexts;
using System.Security.Principal;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;
using Entidades.Seguridad;
using Entidades.Sistema.Base;
using VistaOnlineR1._1.Models;
using Modelo.Seguridad;
using Modelo.Sistema.Base;

namespace VistaOnlineR1._1.Controllers.Seguridad
{
    public class LoginController : Controller
    {
        //
        // GET: /Login/
        private Entidades.Seguridad.Session oSession;
        #region campos
        CatalogoUsuarios _catalogoUsuario;
        CatalogoSession _catalogoSession;
        CatalogoCargo _catalogoCargo;
        CatalogoEmpleado _catalogoEmpleado;
        #endregion

        
        #region Constructors
        public LoginController()
            : this(new CatalogoUsuarios(), new CatalogoSession(), new CatalogoCargo(), new CatalogoEmpleado())
        {
        }

        public LoginController(CatalogoUsuarios catalogoUsuario, CatalogoSession catalogoSession, CatalogoCargo catalogoCargo, CatalogoEmpleado catalogoEmpleado)
        {
            _catalogoUsuario = catalogoUsuario;
            _catalogoSession = catalogoSession;
            _catalogoCargo = catalogoCargo;
            _catalogoEmpleado = catalogoEmpleado;
        }
        #endregion

        public ActionResult Index()
        {
            /*String previousPage = Request.UrlReferrer.LocalPath.ToString();
            Session["previousPage"] = previousPage;*/

            //string RedirectUrl = HttpContext.Request.UrlReferrer.ToString();
            return View();
        }

        [HttpPost]
        public ActionResult Index(string IdUsuario, string Clave, string RedirectUrl)
        {
            bool rta = true;
            
            Usuario oUsuario = _catalogoUsuario.BuscarUsuario(IdUsuario);

          
            string ClaveEncriptada = Encriptar(Clave);

            if (oUsuario == null || oUsuario.Estado == false)
            {
                rta = false;
            }
            else
            {
                if (oUsuario.Clave != ClaveEncriptada) 
                    rta = false;
            }

            if (rta)
            {
                oSession = new Entidades.Seguridad.Session();
                oSession.nombreusuario = oUsuario.IdUsuario;
                oSession.fecha_login = DateTime.Now.ToString("dd/MM/yyyy");
                oSession.hora_login = DateTime.Now.ToString("hh:mm:ss");

                Session["sessionUser"] = oSession;
                CrearCoockie(oUsuario);


                //return Redirect(RedirectUrl);
                return RedirectToAction("Index", "Home");
            }
            else if (false)
            {
                ModelState.AddModelError("", "Usuario o clave Inexistente!");
            }

            return View();
        }

        public ActionResult RecuperarClave()
        {
            return View();
        }

        [HttpPost]
        public ActionResult RecuperarClave(Usuario oUsuario)
        {

            NewPassword NewPassword = new NewPassword();
            string nuevaPass = NewPassword.GenerarPass(3, 10);

            bool changePasswordSucceeded = true;


            Usuario oUsuarioChagePass = _catalogoUsuario.BuscarUsuarioPorEmail(oUsuario.Email);


            //if (oUsuarioChagePass == null || oUsuarioChagePass.Estado == false)
            //{
            //    changePasswordSucceeded = false;
            //}

            //try
            //{
            //    string claveNuevaEncrip = Encriptar(nuevaPass);

            //    oUsuario.Clave = claveNuevaEncrip;
            //    _catalogoUsuario.ModificarUsuario(oUsuarioChagePass);
            //    changePasswordSucceeded = true;

            //}
            //catch (Exception)
            //{
            //    changePasswordSucceeded = false;
            //}
            //if (changePasswordSucceeded)
            //{
            //    SendResetEmail(oUsuario, nuevaPass);
            //}

            if (oUsuarioChagePass == null || oUsuarioChagePass.Estado == false)
            {
                changePasswordSucceeded = false;
            }

            try
            {
                if (changePasswordSucceeded)
                {
                    string claveNuevaEncrip = Encriptar(nuevaPass);

                    //oUsuario.Clave = claveNuevaEncrip;
                    oUsuarioChagePass.Clave = claveNuevaEncrip;
                    _catalogoUsuario.ModificarUsuario(oUsuarioChagePass);
                    changePasswordSucceeded = true;
                }
            }
            catch (Exception)
            {
                changePasswordSucceeded = false;
            }
            if (changePasswordSucceeded)
            {
                SendResetEmail(oUsuario, nuevaPass);
                return View("RecuperarClaveSuccess");
            }

            //return changePasswordSucceeded;

            return View();
        }

        public ActionResult RecuperarClaveSuccess()
        {
            return View();
        }

        public ActionResult Salir()
        {

            oSession = new Session();

            var sessionUser = Session["sessionUser"] as Session;
            
            oSession.nombreusuario = sessionUser.nombreusuario;
            oSession.fecha_login = sessionUser.fecha_login;
            oSession.hora_login = sessionUser.hora_login;
            oSession.fecha_logout = DateTime.Now.ToString("dd/MM/yyyy");
            oSession.hora_logout = DateTime.Now.ToString("hh:mm:ss");
            bool res = _catalogoSession.AgregarSession(oSession);

            Session.Clear();
            FormsAuthentication.SignOut();
            return RedirectToAction("Index", "Home");
        }

        private void CrearCoockie(Entidades.Seguridad.Usuario oUsuario)
        {
            string roles = null;

            Empleado oEmpleado = new Empleado();

            oEmpleado = _catalogoEmpleado.BuscarEmpleadoPornumero(oUsuario.IdUsuario);

         //   if (oEmpleado.IdEmpleado != null)
            if (oEmpleado != null)
              
            {
                foreach (var ogrupo in oEmpleado.Cargo.Grupos)

                     {
                         if (roles != null)
                         {
                             roles = roles + ";" + ogrupo.IdGrupo;
                         }
                         else
                         {
                             roles = ogrupo.IdGrupo;
                         }
                     }
            }

            else
           {

            foreach (var ogrupo in oUsuario.Grupos)
            {
                if (roles != null)
                {
                    roles = roles + ";" + ogrupo.IdGrupo;
                }
                else
                {
                    roles = ogrupo.IdGrupo;
                }
            }

           }
            
            var authTicket = new FormsAuthenticationTicket(
                1,                              // version
                oUsuario.IdUsuario,             // id del usuario
                DateTime.Now,                   // creado
                DateTime.Now.AddMinutes(60),    // tiempo de expiración
                false,                          // persistencia
                roles                           // grupos-roles
                );

            string encryptedTicket = FormsAuthentication.Encrypt(authTicket);

            var authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
            Response.Cookies.Add(authCookie);
        }

        private string Encriptar(string valor)
        {
            System.Security.Cryptography.SHA1CryptoServiceProvider provider = new System.Security.Cryptography.SHA1CryptoServiceProvider();
            byte[] bytes = System.Text.Encoding.UTF8.GetBytes(valor);
            byte[] inArray = provider.ComputeHash(bytes);
            provider.Clear();
            return Convert.ToBase64String(inArray);
        }

        public static void SendResetEmail(Entidades.Seguridad.Usuario usuario, string nuevaPass)
        {

            try
            {

                MailAddress fromAddress = new MailAddress("trabajodediploma2012@gmail.com", "From Name");
                MailAddress toAddress = new MailAddress(usuario.Email, "To Name");
                const string subject = "Reseteo de Password";
                string body = "<p>Usuario:" + usuario.NombreApellido + " su nueva password es: " + nuevaPass + "</p>";
                body += "<p>Si necestia otra información por favor no dude en ponerse en contacto con nosotros.</p>";

                MailMessage msg = new MailMessage(fromAddress.Address, toAddress.Address, subject, body);
                msg.IsBodyHtml = true;

                var client = new SmtpClient("smtp.gmail.com", 587)
                {
                    Credentials = new NetworkCredential("trabajodediploma2012@gmail.com", "diploma2012"),
                    EnableSsl = true
                };

                client.Send(msg);

            }
            catch (Exception ex)
            {
                throw (ex);
            }
        }
    }

    public class NewPassword
    {
        char[] ValueAfanumeric = { 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'z', 'x', 'c', 'v', 'b', 'n', 'm', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '!', '#', '$', '%', '&', '?', '¿' };

        public string GenerarPass(int LongPassMin, int LongPassMax)
        {
            Random ram = new Random();
            int LogitudPass = ram.Next(LongPassMin, LongPassMax);
            string Password = String.Empty;

            for (int i = 0; i < LogitudPass; i++)
            {
                int rm = ram.Next(0, 2);

                if (rm == 0)
                {
                    Password += ram.Next(0, 10);
                }
                else
                {
                    Password += ValueAfanumeric[ram.Next(0, 59)];
                }
            }

            return Password;
        }
    }
}
